package xhe.inf.service;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import xhe.entities.ApiEntity;
import xhe.enums.ExecuteEnum;
import xhe.lib.data.Util;
import xhe.lib.io.Gzip;
import xhe.lib.log.DataCenter;

@Service
public class CommonService {

	public ApiEntity openAPI(HttpServletRequest request, HttpServletResponse response) {

		System.out.println("");
		// 添加请求头,解决跨域问题
		response.addHeader("Access-Control-Allow-Origin", "*");
		// 设置响应内容类型
		response.setContentType("application/json; charset=utf-8");

		// 声明请求
		ApiEntity apiEntity = new ApiEntity();

		try {

			apiEntity.setRequest(Util.getRequest(request.getInputStream()));

			String strRequest = apiEntity.getRequest();

			if (!strRequest.substring(0, 1).equals("{")) {

				// 使用gzip方式对入参解压
				strRequest = Gzip.uncompress(strRequest);
			}

			JSONObject jsonObject = JSON.parseObject(strRequest);

			// 获取方法名称
			apiEntity.setMethodName(jsonObject.getString("Method"));
			// 获取请求参数
			apiEntity.setParams(jsonObject.getString("Params"));
			// 获取Token
			apiEntity.setToken(jsonObject.getString("Token"));
			// 获取数据链接类型
			apiEntity.setDBType(jsonObject.getString("DBType"));
			// 获取数据链接字符串
			apiEntity.setConnection(jsonObject.getString("Connection"));
			// 获取Token
			apiEntity.setUserName(jsonObject.getString("UserName"));
			// 获取数据链接类型
			apiEntity.setLoginName(jsonObject.getString("LoginName"));

			System.out.println("Request:" + strRequest);
			// 验证登陆信息
			if (StringUtils.isEmpty(apiEntity.getToken())) {

				apiEntity.setCode(ExecuteEnum.AuthError);
				apiEntity.setMessage("登陆会话已过期");
			} else if (StringUtils.isEmpty(apiEntity.getDBType())) {

				apiEntity.setCode(ExecuteEnum.DBError);
				apiEntity.setMessage("初始化数据连接出错");
			} else {

				// 动态加载方法,通过反射调用方法
				if (apiEntity.getMethodName().contains("Edit")) {

					// 编辑
					Class<?> oClass = Class.forName("xhe.lib.data.Edit");
					Method oMethod = oClass.getMethod(apiEntity.getMethodName(), ApiEntity.class);
					oMethod.invoke(oClass.newInstance(), apiEntity);

					// 保存编辑日志
					DataCenter.operateLog(apiEntity);

				} else if (apiEntity.getMethodName().contains("Add")) {

					// 添加
					Class<?> oClass = Class.forName("xhe.lib.data.Add");
					Method oMethod = oClass.getMethod(apiEntity.getMethodName(), ApiEntity.class);
					oMethod.invoke(oClass.newInstance(), apiEntity);

					// 保存添加日志
					DataCenter.operateLog(apiEntity);

				} else {
					// 查询
					Class<?> oClass = Class.forName("xhe.lib.data.Get");
					Method oMethod = oClass.getMethod(apiEntity.getMethodName(), ApiEntity.class);
					oMethod.invoke(oClass.newInstance(), apiEntity);
//					apiEntity.setCode(ExecuteEnum.MethodError);
//					apiEntity.setMessage("该方法未实现");
				}
			}

		} catch (Exception ex) {
			apiEntity.setCode(ExecuteEnum.Error);
			apiEntity.setMessage(ex.getMessage());
			ex.printStackTrace();

		}

		System.out.println("Response:" + apiEntity.getResponse());

		return apiEntity;
	}
}
